//
//  main.cpp
//  UniversalArray
//
//  Created by ryu on 2021/9/29.
//

#include <iostream>
#include <cstdlib>
using namespace::std;

//* 可以对内置数据类型以及自定义数据类型的数据进行存储
//* 将数组中的数据存储到堆区
//* 构造函数中可以传入数组的容量
//* 提供对应的拷贝构造函数以及operator=防止浅拷贝问题
//* 提供尾插法和尾删法对数组中的数据进行增加和删除
//* 可以通过下标的方式访问数组中的元素
//* 可以获取数组中当前元素个数和数组的容量

template<class T>
class MyArray{
public:
    int capacity;
    int size;
    //下标使用必须是数组或者指针
    T *array;
    
    MyArray(int capacity){
        this->capacity = capacity;
        this->size = 0;
        this->array = new T[capacity];
    }
    
    ~MyArray(){
        
        delete [] this->array;
        this->capacity = 0;
        this->size = 0;
        this->array = NULL;
    }
    
    //重载 [] 构造
    
    T operator[](int index){
        return this->array[index];
    }
    
    void add(T e){
        this->array[this->size++] = e;
    }
    
    void del(){
        if(this->size == 0)
            return;
        this->size--;
    }
    
    int getCapacity(){
        return this->capacity;
    }
    
    int getSize(){
        return this->size;
    }
    
    //拷贝函数
    MyArray copyOf(){
        MyArray copyArray = MyArray(this->capacity);
        for(int i = 0;i < this->size;i++){
            copyArray.array[i] = this->array[i];
        }
        return copyArray;
    }
    
};


int main(int argc, const char * argv[]) {
    // insert code here...
    
    MyArray<int> array(10);
    for(int i = 1;i < 5;i++){
        array.add(i);
    }
    
    MyArray<int> copyA =  array.copyOf();
//
//    for(int i = 0; i < array.size;i++){
//        cout<<copyA.array[i]<<endl;
//    }
    
    cout<<array[1]<<endl;
    
    cout<<"new 创建"<<endl;
    MyArray<int> *ages = new MyArray<int>(10);
    for (int i = 0; i < 10; i++) {
        ages->add( rand() % 100 + 1);
    }
    
    for (int i = ages->capacity; i > 0; i--) {
        cout<<ages->array[i]<<endl;
    }
    
    delete ages;
    return 0;
}
